// 引入 support.js 的 Container Maybe
const { Container, Maybe } = require('./support')

// 引入 lodash/fp 模块
const fp = require('lodash/fp')
const { findLastIndex } = require('lodash')

/**
 * 练习1：使用 fp.add(x, y) 和 fp.map(f, x) 创建一个能让 functor 里的值增加的函数 ex1
 */

let maybe = Maybe.of([5, 6, 1])


let ex1 = fp.map(fp.add(1))

maybe = maybe.map(ex1)
    .map(ex1)
    .map(ex1)

console.log('练习1：',maybe)

/**
 * 练习2：实现一个函数 ex2 ，能够使用 fp.first 获取列表的第一个元素
 */

let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
/**
 * 这里没整明白怎么个意思，是要在外面拿到 arr 的第一个元素呢？还是要将 Container 里面的 _value 换成第一个元素呢？
 * 如果是在外面拿到的话就是下面这个方法，在外面提前定义一个变量用作接收第一个元素，还是返回原数组就行
 * 如果是通过 ex2 函数将 Container 里面的 _value 编程第一个元素的话，直接 ex2 = fp.first 就行
 */
var firstStr = '';
let ex2 = (_arr) => {
    firstStr = fp.first(_arr)
    return _arr
}
xs = xs.map(ex2)
console.log('练习2：',firstStr)


/**
 * 练习3：实现一个函数 ex3 ，使用 safeProp 和 fp.first 找到 user 的名字的首字母
 */
let safeProp = fp.curry(function(x, o) {
    return Maybe.of(o[x])
})
let user = { id: 2, name: 'Albert' }

let ex3 = (_user)=>{
    return safeProp('name')(_user).map(fp.flowRight(fp.first,fp.split('')))
}
console.log('练习3：',ex3(user))


/**
 * 练习4：使用 Maybe 重写 ex4，不要有 if 语句
 */

let ex4 = function (n) {
    if(n){
        return parseInt(n)
    }
}

ex4 = (n)=>{
    return Maybe.of(n)
        .map(x=>parseInt(x))._value
}
console.log(ex4(8.888));